#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_NICKNAME 10
#define MAX_PASSWORD 10
#define MAX_ID 5
#define SEAT_COUNT 40

struct Admin {
    char name[MAX_NICKNAME]; // 管理员姓名
    char password[MAX_PASSWORD]; // 密码
    char ID[MAX_ID]; // 工号
};

struct Student {
    char name[MAX_NICKNAME]; // 学生姓名
    char password[MAX_PASSWORD]; // 密码
    char ID[MAX_ID]; // 学号
    int cumulativeTime; // 累计使用时间（小时）
};

struct Computer {
    int number; // 座位编号（1-40）
    int state; // 状态：0=空闲，1=已预约
};

// 用户管理函数

/**
 * @brief 注册管理员或学生账户
 * 
 * @param type 1表示管理员，2表示学生
 * @param username 用户名
 * @param password 密码
 */
void registerUser(int type, char* username, char* password) {
    if (type != 1 && type != 2) {
        printf("错误：用户类型错误。\n");
        return;
    }
    
    // 检查用户名是否已存在
    if (strcmp(username, "") == 0) {
        printf("错误：用户名不能为空。\n");
        return;
    }
    
    // 模拟数据库查询，确保用户名唯一性
    // 这里实际需要与数据库连接或文件操作来检查和存储用户信息
    
    // 创建用户数据结构并存储
    Admin admin = { };
    Student student = { };
    
    if (type == 1) {
        strncpy(admin.name, username, sizeof(admin.name));
        strncpy(admin.password, password, sizeof(admin.password));
        strncpy(admin.ID, "adminID", sizeof(admin.ID)); // 示例：用固定的ID或根据实际情况生成
    } else {
        strncpy(student.name, username, sizeof(student.name));
        strncpy(student.password, password, sizeof(student.password));
        strncpy(student.ID, "studentID", sizeof(student.ID)); // 示例：同上
    }
    
    printf("成功注册用户。\n");
}

/**
 * @brief 登录系统
 * 
 * @param type 1表示管理员，2表示学生
 * @param name 用户名
 * @param password 密码
 * @return 0 表示成功登录（返回用户类型）
 *      1 表示失败
 */
int loginUser(int type, char* name, char* password) {
    // 模拟从数据库或文件中读取存储的密码进行比对
    
    if (type == 1) {
        Admin admin;
        strncpy(admin.name, name, sizeof(admin.name));
        strncpy(admin.password, password, sizeof(admin.password));
        printf("管理员登录名为：%s\n", admin.name);
        return 1; // 成功，返回用户类型
    } else if (type == 2) {
        Student student;
        strncpy(student.name, name, sizeof(student.name));
        strncpy(student.password, password, sizeof(student.password));
        printf("学生登录名为：%s\n", student.name);
        return 2; // 成功，返回用户类型
    } else {
        printf("错误：未知的用户类型。\n");
        return -1;
    }
    
    // 假设密码不正确或用户不存在，返回错误状态
    
    printf("登录失败。\n");
    return 0;
}

// 预约系统功能

/**
 * @brief 显示当前座位状态
 */
void showSeatStatus() {
    char seat[SEAT_COUNT];
    for (int i = 0; i < SEAT_COUNT; ++i) {
        if ((i + 1) % 10 == 0 && i != SEAT_COUNT - 1) {
            // 每隔9个座位分段，添加换行符
            seat[i] = '\n';
        } else {
            seat[i] = (state == 0) ? '*' : (state == 1 ? '#' : '!');
        }
    }
    
    printf("%s\n", seat);
}

/**
 * @brief 预约座位
 * 
 * @param userId 用户ID（管理员或学生ID）
 * @param time 预约的时间段（8:00到17:00，表示为0-15小时）
 */
void reserveComputer(int userId, int time) {
    // 检查用户是否有权限进行操作
    
    if (time < 0 || time >= 16) {
        printf("错误：时间超出有效范围。\n");
        return;
    }
    
    // 模拟数据库更新预约状态
    Computer computer;
    computer.number = userId;
    computer.state = 1; // 标记为已预约
    
    printf("成功预约座位号：%d，预计使用时间：%d:00。\n", userId, time + 8);
}

// 故障报告

/**
 * @brief 报告电脑故障
 * 
 * @param computerNumber 要报错的电脑编号（1-40）
 */
void reportError(int computerNumber) {
    // 打开error.txt文件，添加报告内容
    FILE* errorFile = fopen("error.txt", "a");
    
    if (errorFile == NULL) {
        printf("错误：无法打开故障报告文件。\n");
        return;
    }
    
    fprintf(errorFile, "[%d] ", computerNumber);
    fclose(errorFile);
    
    printf("成功报告电脑：%d为故障。\n", computerNumber);
}

// 统计功能

/**
 * @brief 更新当天的实验室使用统计数据
 */
void updateCounts() {
    // 模拟读取当前预约状态，计算一天内的总预约时间等信息
    
    FILE* countFile = fopen("count.txt", "a");
    
    if (countFile == NULL) {
        printf("错误：无法打开统计文件。\n");
        return;
    }
    
    // 假设读取成功，并更新数据
    fclose(countFile);
    printf("已保存当天的实验室使用统计到count.txt。\n");
}

// 输入输出样例

// 注册管理员示例
printf("\n请输入注册管理员信息：\n");
char* adminName = malloc(MAX_NICKNAME);
char* adminPass = malloc(MAX_PASSWORD);
scanf("%s %s", adminName, adminPass);
registerUser(1, adminName, adminPass);

// 登录示例（管理员）
printf("\n请输入管理员登录名和密码：\n");
char* adminLoginName = malloc(MAX_NICKNAME);
char* adminLoginPass = malloc(MAX_PASSWORD);
scanf("%s %s", adminLoginName, adminLoginPass);
loginUser(1, adminLoginName, adminLoginPass);

// 登录示例（学生）
printf("\n请输入学生登录名和密码：\n");
char* studentLoginName = malloc(MAX_NICKNAME);
char* studentLoginPass = malloc(MAX_PASSWORD);
scanf("%s %s", studentLoginName, studentLoginPass);
loginUser(2, studentLoginName, studentLoginPass);

// 预约示例
printf("\n请输入要预约的座位编号和时间：\n");
int seatNumber = atoi(input());
int hour = atoi(input());
reserveComputer(seatNumber, hour);

// 取消预约（管理员）
printf("输入要取消的预约号码：\n");
int cancelSeat = atoi(input());
// 具体实现中需要与数据库或状态表相联系，撤销预约
printf("成功取消座位：%d。\n", cancelSeat);

// 报告故障示例
printf("请输入要报告故障的电脑编号：\n");
int errorComputer = atoi(input());
reportError(errorComputer);

// 统计信息查询（管理员）
printf("\n请输入要查询的统计开始和结束日期：\n");
char* startDateStr = malloc(10);
char* endDateStr = malloc(10);
scanf("%s %s", startDateStr, endDateStr);
updateCounts();
